import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
// 不太合适！如果项目里面多个接口基准地址不同，这样配置就固定死了
// axios.defaults.baseURL = ""
// axios.create({配置对象})==> 创建一个新的axios实例对象
 const baseURL="http://toutiao.itheima.net"
let request = axios.create({
  baseURL
})
// ===========请求拦截器=================
request.interceptors.request.use(config=>{
  // 一定要return config
  console.log("所有的请求都走这里...",config);
  // 如果你登录了，你就带上token！
  if(store.getters.token){
    config.headers.Authorization = 'Bearer '+store.getters.token
    // 需要携带token的接口才携带token，否则不携带,需要token的接口前缀放到authUrl里面
    // let authUrl = ['/userProfile']
    // if(authUrl.includes(config.url)){
    //   config.headers.Authorization='Bearer'+store.getters.token
    // }
  }
  return config
},error=>{
  return Promise.reject(error)
})

// ===========响应拦截器=================
request.interceptors.response.use(response=>{
  console.log('所有响应结果都从这里走');
  // console.log(response);是所有请求响应的结果
  // 必须返回return response 否则没有返回值，页面空白
  return response 
},async error=>{
  // 请求响应返回错误走这里
  console.dir(error);
  if(error.response && error.response.status === 401){
    // token 过期处理
    // 思路：那刷新token去更新新的验证token
    if(!store.getters.token) return
      try {
        // let {data} =request ({}) 不能使用request，还会走上面的请求拦截器，从而导致使用失效token
        let {data} = await axios({
          url:baseURL+'/v1_0/authorizations',
          method:'put',
          headers:{
            Authorization:`Bearer ${store.state.user.refresh_token}`
          }
        })
        // 重新存储到仓库和本地存储中
        store.commit('setUser',{
          token:data.data.token,
          refresh_token:store.state.user.refresh_token
        })
        // 继续上一次的请求  error.config 是上次请求错误的所有请求配置信息
        return request(error.config)
      } catch (err) {
        // 获取验证token失败，有可能是刷新token都失效了，那就要重新登录
        if(err && err.response.status == 500){
          Toast.fail('登录失效，请重新登录')
          store.commit('setUser',{})
          router.push('/login')
      
        }
        return Promise.reject(err)
      }
   
  }else{
    return Promise.reject(error)
  }
  
})

export default request